package com.lesson3;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javassist.expr.NewArray;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="user")
public class User implements Serializable{
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return super.equals(obj);
    }
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return super.hashCode();
    }
    /**
     * 
     */
    private static final long serialVersionUID = 2451911845206634594L;
    private String id;
    private String name;
    private Set<Card> card;
    

    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinColumn(name="card_id",referencedColumnName="name")  //card_id为card表外键,referencedColumnName为本表字段
    public Set<Card> getCard() {
        return card;
    }
    public void setCard(Set<Card> card) {
        this.card = card;
    }
    @Id
    @GeneratedValue(generator="getUuid",strategy=GenerationType.AUTO)
    @GenericGenerator(name="getUuid",strategy="uuid")
    @Column(name="id",nullable=false,unique=true)
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    
    @Column(name="name",length=128)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
package com.lesson3;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;

@Entity
public class Card {
    private int id;
    private String info;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    
    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
}
View Code
package com.lesson3;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

public class Service {
private SessionFactory sessionFactory;
    
    public Service() {
        this.sessionFactory = new AnnotationConfiguration().configure("com/lesson3/lesson3.cfg.xml").buildSessionFactory();
    }
    
    public void Insert(){
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        try {
            User user = new User();
            user.setId("123");
            user.setName("ccc");
            
            
            Set<Card> cards = new HashSet<Card>();
            
            for (int i = 0; i < 2; i++){
                Card card = new Card();
                card.setInfo("card");
                
                cards.add(card);
            }

            user.setCard(cards);

            session.save(user);

            
            
            tx.commit();
        } catch (Exception e) {
            // TODO: handle exception
            tx.rollback();
            e.printStackTrace();
        }finally{
            session.close();
        }
    }
}
View Code
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.url">jdbc:mysql://127.0.0.2:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="format_sql">true</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        <mapping class="com.lesson3.User"/>
        <mapping class="com.lesson3.Card"/>
    </session-factory>
</hibernate-configuration>
View Code

 

当关联到的主表的字段不是主键时,要实现Serializable接口

否则出现以下错误

java.lang.ClassCastException: com.lesson3.User cannot be cast to java.io.Serializable
    at org.hibernate.type.CollectionType.getKeyOfOwner(CollectionType.java:390)
    at org.hibernate.engine.internal.Collections.processReachableCollection(Collections.java:187)
    at org.hibernate.event.internal.FlushVisitor.processCollection(FlushVisitor.java:59)
    at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:121)
    at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:82)
    at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76)
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:174)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:228)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:100)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    at com.lesson3.Service.Insert(Service.java:42)
    at test.com.lesson3.TestService.testInsert(TestService.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)