3

@transient と transient キーワードの間の議論を読みました: JPA に @Transient アノテーションがあるのはなぜですか?

しかし、@Transient 表記ではなく java キーワードを使用して特定のフィールドを一時的にすると、それらのフィールドはテーブルの作成時にテーブルに作成されません。どうしてこれなの?

ここに私の 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 という 2 つのフィールドしかありません。永続化API 1.0も使用しました

4

3 に答える 3

6

JPAの観点からは、アノテーションと修飾子は完全に同等であり、どちらもフィールドが永続化されないことを意味します。JSR220仕様の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.
于 2013-01-08T15:11:20.623 に答える
0

一時フィールドは永続化に参加せず、シリアライゼーションに参加しない Java の一時フィールドと同様に、それらの値がデータベースに格納されることはありません。

于 2014-02-24T05:52:38.290 に答える