2
votes

I am complete new to Hibernate and I have a question in the following condition.

User Class

@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);
}

History Class

@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;
}

The Schemate

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)
);

App class

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 will insert an entry to the history_table, but I also need the user_history_table to be updated too. So, should I create another object, say user_history_obj and update it just like the history_table update or there is a hibernate way of doing it. Thnaks.

1

1 Answers

1
votes

The relation between User and History looks a bit like a many-to-many with user_history as a join table.

You might be better off mapping it that way. See the section on @ManyToMany in Hibernate Annotations Reference on mapping associations.

This will change the layout of your user_history table, by removing it's autogenerated primary key. But it might be worth a try, and it would likely make the table populate this relation in a reasonably sensible way.

EDIT:

I'm not sure now why I thought many-to-many, but mapping it one-to-many with a join table is likely fine. Once you've created your History object, if you add it to the User object's userHistory set, the user_history_table entry will be created and saved with a merge of theUser object.