transient-Schlüsselwort mit JPA nicht wie erwartet funktioniert
Ich habe gelesen, die Diskussion zwischen @Transienten und Transienten-Stichwort: Warum JPA habe ein @Transient annotation?
Aber wenn ich bestimmte Feld transient mit dem java-Schlüsselwort und NICHT das @Transient notation, diese Felder werden nicht in meine Tabelle auf eine Tabelle anzulegen. Warum ist das so?
Hier ist meine 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>
hier ist ein Beispiel entity:
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);
}
}
Hinweis: In der obigen Datei habe ich entfernt, einige unbedeutende Einfuhren.
In der generierten Tabelle gibt es nur zwei Felder, nämlich die SESSIONID und USER_USERID.
Ich habe auch das persistence api 1.0
- persistence.xml allein nicht genug, um diese Frage zu beantworten. Zeigen, wo Sie vorübergehend in der Klasse.
- Ich habe den Session-entity als ein Beispiel
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom JPA Sicht der annotation und die modifier sind vollkommen gleichwertig und beides bedeutet, dass das Feld nicht gespeichert. Siehe Absatz 2.1.1 der JSR 220-Spezifikation, wo es heißt:
@XmlRootElement
und markieren Sie die Felder, die Sie nicht wollen, zu übertragen@XmlTransient
.transient
Modifikator ist äquivalent zu der@Transient
annotation, in beide Richtungen das Feld nicht zugeordnet, um jede Spalte in der Datenbank.Transiente Felder sind nicht an der Ausdauer, und Ihre Werte werden nie in der Datenbank gespeichert, ähnlich Transienten Felder in Java, die nicht an der Serialisierung
ANTWORT von Buch - Pro JPA-Mastering the Java Persistence API (JPA
..
Wir haben verwendet, die transient-Modifikator anstelle der @Transient annotation, so dass, wenn der Arbeitnehmer(z.B. ein Unternehmen) wird serialisiert von einer VM zu einer anderen, dann wird das Feld neu initialisiert bekommen, zu entsprechen, wird das Gebietsschema der die neue VM.
In Fällen, In denen die nicht-persistenten Wert sollte beibehalten werden, über die Serialisierung, die Anmerkung soll verwendet werden, anstelle der modifier.