通过一张中间表存储两个表之间的关联关系
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinTable(name="user_card",joinColumns={@JoinColumn(name="id1")},inverseJoinColumns={@JoinColumn(name="id2")})
package com.lesson4; 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.JoinTable; import javax.persistence.ManyToMany; 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{ private String id; private String name; private Set<Card> card; @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY) @JoinTable(name="user_card",joinColumns={@JoinColumn(name="id1")},inverseJoinColumns={@JoinColumn(name="id2")}) 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.lesson4; 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; } }
package com.lesson4; 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/lesson4/lesson4.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(); } } }
<?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.lesson4.User"/> <mapping class="com.lesson4.Card"/> </session-factory> </hibernate-configuration>