我已经阅读了@transient和transient关键字之间的讨论:Why does JPA have a @Transient annotation?
但是当我使用java关键字而不是@Transient表示法创建某个字段瞬态时,这些字段不会在创建表的表中创建。这是为什么?
这是我的persistence.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<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_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="someDB" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>somewhere.classnameA</class>
<class>somewhere.classnameB</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/project" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="both" />
</properties>
这是一个示例实体:
import java.sql.Timestamp;
import com.google.gwt.user.client.rpc.IsSerializable;
@Entity
public class Session implements IsSerializable{
@Id
@Basic(optional = false)
@Column(length = 36)
private String sessionID;
@Version
@Basic(optional = false)
transient private Timestamp lastModification;
@Basic(optional = false)
transient private Timestamp expireTime;
@OneToOne(optional = false)
private User user;
protected Session(){
}
// constructor server side
public Session(String sessionID, User user, Timestamp expireTime){
this.sessionID = sessionID;
this.user = user;
this.expireTime = expireTime;
}
public String getSessionID() {
return sessionID;
}
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
public Timestamp getLastModification() {
return lastModification;
}
public void setLastModification(Timestamp lastModification) {
this.lastModification = lastModification;
}
public Timestamp getExpireTime() {
return expireTime;
}
public void setExpireTime(Timestamp expireTime) {
this.expireTime = expireTime;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
@Transient
public String toString() {
String userID = (user != null) ? String.valueOf(user.getUserID()) : "?";
return String.format("(%s)%s", userID, sessionID);
}
}
注意:在上面的文件中,我删除了一些不重要的导入。 在生成的表中,只有两个字段,即SESSIONID和USER_USERID。 我还使用了持久性api 1.0
答案 0 :(得分:5)
从JPA的角度来看,注释和修饰符完全等效,两者都表示该字段不是持久的。见JSR 220 Specification的第2.1.1段,其中说:
If the entity has field-based access, the persistence provider runtime accesses
instance variables directly. All non-transient instance variables that are not
annotated with the Transient annotation are persistent.
答案 1 :(得分:0)
瞬态字段不参与持久性,它们的值永远不会存储在数据库中,类似于Java中不参与序列化的瞬态字段
答案 2 :(得分:0)
ANSWER来自书 - Pro JPA掌握JPA
.. 我们使用了transient修饰符而不是@Transient注释,这样如果Employee(例如一个实体)从一个VM序列化到另一个VM,那么该字段将重新初始化以对应于新VM的区域设置。 如果跨序列化应保留非持久性值,则应使用注释而不是修饰符。