📄 jpa开发.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数据源配置:
登陆:http://localhost:4848/
Resources/jdbc/connection pools/附加属性修改数据库名/ping成功即可
数据源名字:点击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. 发布时不要带javaee.jar等包
3. persistence.xml的dtd要用对
五、关系的映射
1. 属性
1)@OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
private Set options = new HashSet();
CascadeType--级联
PERSIST (级联新建)
REMOVE (级联删除)
REFRESH (级联刷新)
MERGE (级联更新)中选择一个或多个。
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的多对一关联关系,并通过@JoinColumn指定关联PollTopic实体所对应表的“外键”,
3)@Transient:JPA规范规定任何属性都默认映射到表中,但JPA将按照默认的规则对该字段进行映射:字段名和属性名相同,类型相同。如果我们不希望将某个属性持久化到数据表中,则可以通过@Transient注解显式指定:
4)@Entity:将领域对象标注为一个实体,表示需要保存到数据库中,默认情况下类名即为表名,通过name属性显式指定表名
@Entity(name = "T_TOPIC")
5)@Id :对应的属性是表的主键
6)@GeneratedValue:主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql对应auto_increment。
@GeneratedValue(strategy = GenerationType.TABLE)
1) IDENTITY:表自增键字段,Oracle不支持这种方式;
2) AUTO: JPA自动选择合适的策略,是默认选项;
3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。不同的JPA实现商生成的表名是不同的,如OpenJPA生成openjpa_sequence_table表Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。
7)@Column(name = "TOPIC_ID"):属性对应的表字段。我们并不需要指定表字段的类型,因为JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度,以便可以自动生成DDL语句
@Column(name = "TOPIC_TITLE", length = 100)
8)@Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型
@Temporal(TemporalType.DATE)
1) DATE :等于java.sql.Date
2) TIME :等于java.sql.Time
3) TIMESTAMP :等于java.sql.Timestamp
9) @Table(name="users)
name: 表名
catalog: 对应关系数据库中的catalog
schema:对应关系数据库中的schema
UniqueConstraints:定义一个UniqueConstraint数组,指定需要建唯一约束的列
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -