Таблица обновления гибернации B после обновления таблицы A - PullRequest
2 голосов
/ 04 июля 2011

Я полностью новичок в Hibernate и у меня есть вопрос в следующем состоянии.

Класс пользователя

@Entity
@Table (name="user_table")
public class User implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    +getters and setters    
    //access by field
    //primary key
    @Id
    @Column (name = "username")
    private String username;
    @Column (name = "password")
    private String password;
    @Column (name = "email")
    private String email;
    /**
     * Cascade all operations
     */
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "user_history_table", 
            joinColumns = { @JoinColumn(name = "username") }, 
            inverseJoinColumns = { @JoinColumn(name = "history_id") }
    )
    private Set userHistory = new HashSet(0);
}

Класс истории

@Entity
@Table (name="history_table")
public class History {

    +getters and setters
    //primary key
    @Id
    @Column (name = "history_id")
    private int id;
    @Column (name="url")
    private String url;
    @Column (name="region")
    private String region;
    @Column (name="source")
    private String source;
    @Column (name="target")
    private String target;
    @Column (name="cost")
    private double cost;
    @Column (name="balance")
    private double balance;
}

Схема

create table user_table(
username varchar(50) NOT NULL PRIMARY KEY,
password varchar(20),
email varchar(150)
);

create table history_table(
history_id INTEGER AUTO_INCREMENT PRIMARY KEY,
url varchar(1000) NOT NULL,
cur_timestamp timestamp default now(),
region varchar (100) NOT NULL,
source varchar(30) NOT NULL,
target varchar(30) NOT NULL,
cost decimal (10,2) NOT NULL,
balance decimal (10,2) NOT NULL
);

create table user_history_table(
user_history_id INTEGER AUTO_INCREMENT PRIMARY KEY,
username varchar(50) NOT NULL,
history_id INTEGER NOT NULL,
FOREIGN KEY (username) REFERENCES user_table(username),
FOREIGN KEY (history_id) REFERENCES history_table(history_id)
);

Класс приложения

public class App {

    public static void main(String [] args){
        SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

        Session session = sessionFactory.getCurrentSession();

        Transaction tx = session.beginTransaction();        
        System.out.println("Inserting Record");
        History history = new History();       
        history.setBalance(1000);
        history.setCost(50.99);
        history.setRegion("region");
        history.setSource("Source_test");
        history.setTarget("Target_test");
        history.setUrl("http://stackoverflow.com/");
        session.save(history);
        tx.commit();
        System.out.println("Done");
    }
}

App.java вставит записьв history_table, но мне также нужно обновить user_history_table.Итак, я должен создать другой объект, скажем user_history_obj, и обновить его так же, как обновление history_table или есть спящий способ сделать это.Thnaks.

1 Ответ

1 голос
/ 04 июля 2011

Отношение между User и History выглядит как «многие ко многим» с user_history в качестве таблицы объединения.

Возможно, вам будет лучше сопоставить это таким образом.См. Раздел @ManyToMany в Справка по Hibernate. Справочник по сопоставлениям сопоставлений .

Это изменит макет таблицы user_history, удалив ее автоматически сгенерированный первичный ключ.Но это может стоить попробовать, и это, вероятно, заставит таблицу заполнить это отношение разумным способом.

РЕДАКТИРОВАТЬ:

Я не уверен сейчаспочему я думал «многие ко многим», но сопоставление «один ко многим» с помощью таблицы соединений, вероятно, хорошо.После создания объекта History, если вы добавите его в набор userHistory объекта User, запись user_history_table будет создана и сохранена с merge объекта User.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...