@Entity(name="Customer")//Customer:实体的名称select c from Customer c
@Table(schema="db",uniqueConstraints={
//唯一鍵
@UniqueConstraint(
columnNames = {"CUSTOMER_NAME"}
)/*,@UniqueConstraint(
columnNames = {"NAME","SHORTNAME"}
)*/
})//CUSTOMER:表名,catalog:目录名,schema:数据库
1. Sequence生成器:
@Id
@GeneratedValue(
strategy=GenerationType.SEQUENCE,
generator="myseq"
)
@SequenceGenerator(
name="myseq",
sequenceName="id_seq"//,initialValue=1,allocationSize=1
)
/*@Id @GeneratedValue(generator = "myseq")
@org.hibernate.annotations.GenericGenerator(
name = "myseq",
parameters = {
@org.hibernate.annotations.Parameter(
name="sequence",value="id_seq"
)},
strategy = "sequence"
)*/
@GeneratedValue(
strategy=GenerationType.TABLE,
generator="myseq"
)
@TableGenerator(
name="myseq",
table="tb_seq",
pkColumnName="gen_name",//栏位名
valueColumnName="gen_value",//栏位名
pkColumnValue="pk_tb_seq",//栏位值
allocationSize=1//,UniqueConstraint同Table一样
)
@Embeddable
public class CustomerPK implements java.io.Serializable{
private String name;
private String email;
public class Customer implements java.io.Serializable {
@EmbeddedId
private CustomerPK pk;
//@Embeddable(第一种方式)
public class SCId implements Serializable {
private Long sno; // 学号
private Long cno; // 课程号
@Id//(第一种方式) 此方式SC.java中需@Embeddable
@AttributeOverrides({
@AttributeOverride(name="sno",column=@Column(name="SNO")),
@AttributeOverride(name="cno",column=@Column(name="CNO"))
})
@EmbeddedId//此方式SC.java中无需@Embeddable(第二种方式)
@AttributeOverrides({
@AttributeOverride(name="sno",column=@Column(name="SNO")),
@AttributeOverride(name="cno",column=@Column(name="CNO"))
})
//@Transient(映射非持久化类型)
private SCId scid;
<!-- <composite-id name="scid" class="SCId"> -->
<composite-id>
<key-property name="sno" type="long">
<column name="Sno" />
</key-property>
<key-property name="cno" type="long">
<column name="Cno" />
</key-property>
</composite-id>
@Basic(fetch=FetchType.EAGER,optional=false)//LAZY:延时加载,EAGER:即时加载(default EAGER),optional表示属性是否可为空default true
@Temporal(TemporalType.DATE)//default java.sql.TIMESTAMP Temporal@转换成java.util.Date
@Column(
name="CUSTOMER_NAME",
//unique=true,//是否唯一
//nullable=false,//是否为空
//insertable=false,//是否允许insert
//updatable=false,//是否允许update
//columnDefinition="varchar2(200) not null",
length=512//precision=12,scale=2,精度为12位,小数倍数为2
)
@Enumerated(EnumType.ORDINAL)//EnumType.STRING
private CustomerType types;
public enum CustomerType {
COMPETITOR,INVESTOR,PARTNER,VENDER
}
User.java:
@OneToOne
@PrimaryKeyJoinColumn
@org.hibernate.annotations.Cascade(
value = org.hibernate.annotations.CascadeType.SAVE_UPDATE
)
private Address address;
<class name="User" table="USER">
<id name="id" type="long" column="USER_ID">
<generator class="sequence">
<param name="sequence">id_seq</param>
</generator>
</id>
<property name="loginName"/>
<property name="admin" type="yes_no"/>
<one-to-one name="address" class="Address" cascade="save-update"/>
</class>
Address.java:
@Id @GeneratedValue(generator = "myForeignGenerator")
@org.hibernate.annotations.GenericGenerator(
name = "myForeignGenerator",
strategy = "foreign",
parameters = @org.hibernate.annotations.Parameter(name = "property",value = "user")
)
@Column(name = "ADDRESS_ID")
private Long id;
@OneToOne
@PrimaryKeyJoinColumn
private User user;
<class name="Address" table="ADDRESS">
<id name="id" type="long" column="ADDRESS_ID">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="street"/>
<property name="city"/>
<property name="zipcode"/>
<one-to-one name="user" class="User" constrained="true"/>
</class>
必须设置双向关系:
User user = new User("F1605818","赵训勇","5818");
Address address = new Address("sz","518109");
user.setAddress(address);
address.setUser(user);
em.persist(user);
查询时:left outer join
User_A.java:
@OneToOne(
targetEntity=Address.class,//可以省略
cascade={CascadeType.ALL},
fetch=FetchType.LAZY,
optional=false//,该实体不能为空,
//mappedBy=""
)
@JoinColumn(
name=" ADDRESS_ID",//default 关联表名称+"_"+关联主鍵的字段名
referencedColumnName="ID",//默认为主鍵
nullable=false,
updatable=false
)
@org.hibernate.annotations.Cascade(
value = org.hibernate.annotations.CascadeType.SAVE_UPDATE
)
private Address_A address;
<many-to-one name="address" class="Address_A"
column="ADDRESS_ID" cascade="save-update" unique="true"/>
Address_A.java:
@OneToOne(mappedBy="address")
private User_A user;
<one-to-one name="user" class="User_A" property-ref="address"/>
@SecondaryTable(name = "CUSTOMER_ADDRESS")
public class AddressEO implements java.io.Serializable {
...
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(table = "CUSTOMER_ADDRESS",name = "USER_ID")
private CustomerEO customer;
<join table="CUSTOMER_ADDRESS" optional="true" inverse="true">
<key column="ADDRESS_ID" unique="true" not-null="true"/>
<many-to-one name="customer" column="CUSTOMER_ID" not-null="true" unique="true"/>
</join>
Teacher.java:
@OneToMany(targetEntity=st1.Student.class,mappedBy = "teacher")
@JoinColumn(name = "TEACHER_ID",nullable = false)
private Set students = new HashSet();
<set name="students" inverse="true" lazy="false" fetch="select" batch-size="4">
<key>
<column name="TEACHER_ID" precision="22" scale="0" />
</key>
<one-to-many class="Student" />
</set>
@OneToMany(targetEntity=st1.Student.class,mappedBy = "teacher")
@org.hibernate.annotations.IndexColumn(name=”POSITION”)
@JoinColumn(name = "TEACHER_ID",nullable = false)
private List students = new ArrayList();
<list name="students" inverse="true" lazy="false" fetch="select" batch-size="4">
<key column name="TEACHER_ID" not-null=”true” />
<list-index column=”POSITION”/>
<one-to-many class="Student" />
</list>
@MapKey(name = "id")
@OneToMany(mappedBy = "item")
@JoinColumn(name = "ITEM_ID",nullable = false)
@org.hibernate.annotations.Cascade(
value = org.hibernate.annotations.CascadeType.SAVE_UPDATE
)
private Map<Long,Bid> bids = new HashMap<Long,Bid>();
<map name="bids" inverse="true">
<key column="ITEM_ID"/>
<!-- formula使变成只读,从不更新此栏位 -->
<map-key type="long" formula="ID"/>
<one-to-many class="Bid"/>
</map>
@OneToMany(cascade={CascadeType.ALL})
@JoinTable(
name=”CUSTOMER_ADDRESS”,
joinColumns={
@JoinColumn(name="customer_id",referencedColumnName="id")
},
inverseJoinColumns={
@JoinColumn(name="address_id",referencedColumnName="id")
}
)
private Set<AddressEO> address = new HashSet<AddressEO>();
<set name="address" table="CUSTOMER_ADDRESS" cascade="save-update">
<key column="USER_ID"/>
<many-to-many class="Address" column="ADDRESS_ID" unique="true"/>
</set>
@Entity
public class Category implements Serializable {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
@ManyToOne(
targetEntity = Category.class
)
@org.hibernate.annotations.Cascade(
value = org.hibernate.annotations.CascadeType.SAVE_UPDATE
)
private Category parentCategory;
@OneToMany(
targetEntity = Category.class,
mappedBy = "childCategories"//相当于inverse="true"
)
@org.hibernate.annotations.Cascade(
value = org.hibernate.annotations.CascadeType.SAVE_UPDATE
)
private Set childCategories;
<set name="childCategories" cascade="save-update" inverse="true">
<key column="CATEGORY_ID" />
<one-to-many class="Category" />
</set>
<many-to-one name="parentCategory" column="CATEGORY_ID" class="Category"/>
Student.java:
@ManyToOne(targetEntity = st1.Teacher.class)
@org.hibernate.annotations.Cascade(
value = org.hibernate.annotations.CascadeType.SAVE_UPDATE
)
@JoinColumn(name = "TEACHER_ID",nullable =false)
private Teacher teacher;
<many-to-one name="teacher" class="Teacher" cascade="save-update">
<column name="TEACHER_ID" precision="22" scale="0" />
</many-to-one>
//映射非主鍵
@JoinColumn(name = "SELLER_NR",referencedColumnName = "CUSTOMER_NR")
<many-to-one name="seller" column="SELLER_NR" property-ref="customerNr"/>
@SecondaryTable(name = "CUSTOMER_ADDRESS")
public class AddressEO implements java.io.Serializable {
...
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(table = "CUSTOMER_ADDRESS",name = "USER_ID")
private CustomerEO customer;
<join table="CUSTOMER_ADDRESS" optional="true" inverse="true">
<key column="ADDRESS_ID" unique="true" not-null="true"/>
<many-to-one name="customer" column="CUSTOMER_ID"/>
</join>
@Entity
public class Category {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
@org.hibernate.annotations.CollectionOfElements
@JoinTable(
name = "CATEGORY_ITEM",
joinColumns = @JoinColumn(name = "CATEGORY_ID")
)
private Set<CategorizedItem> categorizedItems = new HashSet<CategorizedItem>();
@Embeddable
public class CategorizedItem {
@Column(name = "ADDED_BY_USER")
private String username;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "ADDED_ON",nullable=false,updatable=false)
private Date dateAdded = new Date();
@org.hibernate.annotations.Parent
private Category category;
@ManyToOne
@JoinColumn(name = "ITEM_ID",nullable=false,updatable=false)
private Item item;
<class name="Category" table="CATEGORY">
<id name="id" type="long" column="ID">
<generator class="sequence">
<param name="sequence">id_seq</param>
</generator>
</id>
<property name="name"/>
<set name="categorizedItems" table="CATEGORY_ITEM">
<key column="CATEGORY_ID"/>
<composite-element class="CategorizedItem">
<parent name="category"/>
<many-to-one name="item" column="ITEM_ID" not-null="true" class="Item"/>
<!-- <many-to-one name="user" column="USER_ID" not-null="true" class="User"/> -->
<property name="username" column="ADDED_BY_USER"/>
<property name="dateAdded" column="ADDED_ON"/>
</composite-element>
</set>
</class>
评论