⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpa开发.txt

📁 jpa开发
💻 TXT
📖 第 1 页 / 共 4 页
字号:
   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 + -