?? jpa開發(fā).txt
字號:
6 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>aa</servlet-name>
<servlet-class>org.accp.well.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
</web-app>
7 persistence.xml
用描述文件persistence.xml來定義persistence unit.打包做成WAR文件,可以把它放在WEB-INF/之下.和web.xml平級.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="aa" transaction-type="JTA">
<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
<jta-data-source>jdbc/__derby</jta-data-source>
</persistence-unit>
</persistence>
jdbc/__derby數(shù)據(jù)源配置:
登陸:http://localhost:4848/
Resources/jdbc/connection pools/附加屬性修改數(shù)據(jù)庫名/ping成功即可
數(shù)據(jù)源名字:點擊JDBC Resources,新增一個derby/accp
8. 客戶端的HTML文件
<html>
<head>
<title>JPA in Web example</title>
</head>
<body>
<form action="userServlet" method="get">
用戶ID: <input type="text" name="userid"> <br/>
提交: <input type="submit" value="提交">
</form>
</body>
</html>
9、常見問題
1. web.xml的dtd用2.5的
2. 發(fā)布時不要帶javaee.jar等包
3. persistence.xml的dtd要用對
五、關(guān)系的映射
1. 屬性
1)@OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
private Set options = new HashSet();
CascadeType--級聯(lián)
PERSIST (級聯(lián)新建)
REMOVE (級聯(lián)刪除)
REFRESH (級聯(lián)刷新)
MERGE (級聯(lián)更新)中選擇一個或多個。
ALL ,表示選擇全部四項
FetchType--加載策略
LAZY:延遲
EAGER:立即
mappedBy:mappedBy屬性指定“Many”方類引用“One”方類的屬性名,這里mappedBy="pollTopic"表示PollOption實體擁有一個指定PollTopic的pollTopic屬性。
2)@ManyToOne
@JoinColumn(name="TOPIC_ID", nullable=false)
private PollTopic pollTopic;
@ManyToOne描述了PollOption和PollTopic的多對一關(guān)聯(lián)關(guān)系,并通過@JoinColumn指定關(guān)聯(lián)PollTopic實體所對應(yīng)表的“外鍵”,
3)@Transient:JPA規(guī)范規(guī)定任何屬性都默認(rèn)映射到表中,但JPA將按照默認(rèn)的規(guī)則對該字段進行映射:字段名和屬性名相同,類型相同。如果我們不希望將某個屬性持久化到數(shù)據(jù)表中,則可以通過@Transient注解顯式指定:
4)@Entity:將領(lǐng)域?qū)ο髽?biāo)注為一個實體,表示需要保存到數(shù)據(jù)庫中,默認(rèn)情況下類名即為表名,通過name屬性顯式指定表名
@Entity(name = "T_TOPIC")
5)@Id :對應(yīng)的屬性是表的主鍵
6)@GeneratedValue:主鍵的產(chǎn)生策略,通過strategy屬性指定。默認(rèn)情況下,JPA自動選擇一個最適合底層數(shù)據(jù)庫的主鍵生成策略,如SqlServer對應(yīng)identity,MySql對應(yīng)auto_increment。
@GeneratedValue(strategy = GenerationType.TABLE)
1) IDENTITY:表自增鍵字段,Oracle不支持這種方式;
2) AUTO: JPA自動選擇合適的策略,是默認(rèn)選項;
3) SEQUENCE:通過序列產(chǎn)生主鍵,通過@SequenceGenerator注解指定序列名,MySql不支持這種方式;
4) TABLE:通過表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫移植。不同的JPA實現(xiàn)商生成的表名是不同的,如OpenJPA生成openjpa_sequence_table表Hibernate生成一個hibernate_sequences表,而TopLink則生成sequence表。這些表都具有一個序列名和對應(yīng)值兩個字段,如SEQ_NAME和SEQ_COUNT。
7)@Column(name = "TOPIC_ID"):屬性對應(yīng)的表字段。我們并不需要指定表字段的類型,因為JPA會根據(jù)反射從實體屬性中獲取類型;如果是字符串類型,我們可以指定字段長度,以便可以自動生成DDL語句
@Column(name = "TOPIC_TITLE", length = 100)
8)@Temporal(TemporalType.DATE):如果屬性是時間類型,因為數(shù)據(jù)表對時間類型有更嚴(yán)格的劃分,所以必須指定具體時間類型
@Temporal(TemporalType.DATE)
1) DATE :等于java.sql.Date
2) TIME :等于java.sql.Time
3) TIMESTAMP :等于java.sql.Timestamp
9) @Table(name="users)
name: 表名
catalog: 對應(yīng)關(guān)系數(shù)據(jù)庫中的catalog
schema:對應(yīng)關(guān)系數(shù)據(jù)庫中的schema
UniqueConstraints:定義一個UniqueConstraint數(shù)組,指定需要建唯一約束的列
10) @blob 大對象
2. 一對多
drop table sdept;
drop table suser;
create table suser(pk1 int not null primary key , userid varchar(20), PASSWORD varchar(20), deptid int);
create table sdept(pk1 int not null primary key, deptname varchar(20));
alter table suser add constraint fk_2 foreign key(deptid) references sdept(pk1);
insert into sdept(pk1,deptname) values(1,'aptech');
insert into suser(pk1,userid,password,deptid) values(1,'zs','123',1);
1) Suser.java
@Entity
@Table(name = "suser",schema = "APP")
public class Suser implements Serializable {
private Integer pk1;
private String userid;
private String password;
private Sdept dept;
@ManyToOne
@JoinColumn(name="deptid")
public Sdept getDept() {
return dept;
}
public void setDept(Sdept dept) {
this.dept = dept;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Id
public Integer getPk1() {
return pk1;
}
public void setPk1(Integer pk1) {
this.pk1 = pk1;
}
@Column(name = "userid")
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
}
2) Sdept.java
@Entity
@Table(name = "SDEPT", schema = "APP")
public class Sdept implements Serializable {
private Integer pk1;
private String deptname;
private Set<Suser> users = new HashSet<Suser>();
@Id
public int getPk1() {
return pk1;
}
public void setPk1(int pk1) {
this.pk1 = pk1;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
@OneToMany(mappedBy="dept",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
public Set<Suser> getUsers() {
return users;
}
public void setUsers(Set<Suser> users) {
this.users = users;
}
}
3) One2ManyDao.java
public class One2ManyDao {
private static final EntityManagerFactory emf;
private static EntityManager em;
static {
emf = Persistence.createEntityManagerFactory("aaa");
if (em == null)
em = emf.createEntityManager();
}
public void queryByUser() {
Suser user = em.find(Suser.class, 1);
System.out.println(user.getUserid()+"\t"+user.getDept().getDeptname());
}
public void save(Suser u) {
em.getTransaction().begin();
em.persist(u);
em.getTransaction().commit();
}
public static void main(String[] args) {
One2ManyDao dao = new One2ManyDao();
dao.queryByUser();
}
}
4) persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="aaa" transaction-type="RESOURCE_LOCAL">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<!--<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>-->
<class>org.accp.po.Suser</class>
<class>org.accp.po.Sdept</class>
<properties>
<property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
<property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/accp;create=true" />
<property name="toplink.jdbc.user" value="app" />
<property name="toplink.jdbc.password" value="app" />
</properties>
</persistence-unit>
</persistence>
3. 多對多
drop table user1;
drop table duty1;
create table user1(pk1 int not null primary key , userid varchar(20));
create table duty1(pk1 int not null primary key, dutyname varchar(20));
create table userduty(pk1 int not null primary key, uid int not null,did int not null);
alter table userduty add constraint fk_uid foreign key(uid) references user1(pk1);
alter table userduty add constraint fk_did foreign key(did) references duty1(pk1);
insert into user1(pk1,userid) values(1,'zs');
insert into duty1(pk1,dutyname) values(1,'project manager');
insert into userduty(pk1,uid,did) values(1,1,1);
1) User1.java
@Entity
@Table(name = "USER1", schema = "APP", uniqueConstraints = {})
public class User1 implements java.io.Serializable {
private Integer pk1;
private String userid;
private Set<Duty1> duties = new HashSet<Duty1>(0);
@Id
@Column(name = "PK1", unique = true, nullable = false, insertable = true, updatable = true)
public Integer getPk1() {
return this.pk1;
}
public void setPk1(Integer pk1) {
this.pk1 = pk1;
}
@Column(name = "USERID", unique = false, nullable = true, insertable = true, updatable = true, length = 20)
public String getUserid() {
return this.userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "userduty",
joinColumns = {@JoinColumn(name = "uid")},
inverseJoinColumns = {@JoinColumn(name = "did")})
public Set<Duty1> getDuties() {
return this.duties;
}
public void setDuties(Set<Duty1> duties) {
this.duties = duties;
}
}
2) Duty1.java
@Entity
@Table(name = "DUTY1", schema = "APP", uniqueConstraints = {})
public class Duty1 implements java.io.Serializable {
private Integer pk1;
private String dutyname;
private Set<User1> users = new HashSet<User1>(0);
@Id
@Column(name = "PK1", unique = true, nullable = false, insertable = true, updatable = true)
public Integer getPk1() {
return this.pk1;
}
public void setPk1(Integer pk1) {
this.pk1 = pk1;
}
@Column(name = "DUTYNAME", unique = false, nullable = true, insertable = true, updatable = true, length = 20)
public String getDutyname() {
return this.dutyname;
}
public void setDutyname(String dutyname) {
this.dutyname = dutyname;
}
@ManyToMany( fetch = FetchType.LAZY)
@JoinTable(name = "userduty",
joinColumns = {@JoinColumn(name = "did")},
inverseJoinColumns = {@JoinColumn(name = "uid")})
public Set<User1> getUser1() {
return this.users;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -