jpa mysql 主键_mysql – 如何使用JPA引用的表的主键更新一...

本文探讨了如何使用Java JPA根据USER_LOCATION表的LOCATIONID来更新USER表中的LOCATION_ID。提供了相关的数据库表结构和Java实体类示例,并展示了业务规则,即在USER_LOCATION表中不允许存在UNIQUE KEY USER_LOCATION_U1的重复条目。测试用例展示了一个创建新用户并设置其LOCATION_ID的过程。
摘要由CSDN通过智能技术生成

我有两张表如下,

用户

+--------+---------------+------------+--------+-----------+------------+--------------+----------------+----------------+-------------+

| USERID | EMAIL | FIRST_NAME | HONORS | LAST_NAME | LOGIN_TYPE | PHONE_NUMBER | PROFILE_PIC | RECENT_CONV_ID | LOCATION_ID |

+--------+---------------+------------+--------+-----------+------------+--------------+----------------+----------------+-------------+

| 1 | asf@gmail.com | ghj | 0 | ert | 0 | 9879878 | http://vvv.com | NULL | NULL |

?——– ————— ———— ——– ——- —- ———— ————– —————- —- ———— ————-

USER_LOCATION

+------------+-------+---------+----------+------------+-----------+-------+

| LOCATIONID | CITY | COUNTRY | LATITUDE | LOCAL_ADDR | LONGITUDE | STATE |

+------------+-------+---------+----------+------------+-----------+-------+

| 1 | xyz | mm | 10 | asfdasf | 10 | qqq |

+------------+-------+---------+----------+------------+-----------+-------+

下面是两个表的CREATE TABLE查询,

CREATE TABLE `USER` (

`USERID` bigint(20) NOT NULL AUTO_INCREMENT,

`EMAIL` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,

`FIRST_NAME` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,

`HONORS` bigint(20) NOT NULL,

`LAST_NAME` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,

`LOGIN_TYPE` int(11) NOT NULL,

`PHONE_NUMBER` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,

`PROFILE_PIC` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,

`RECENT_CONV_ID` bigint(20) DEFAULT NULL,

`LOCATION_ID` bigint(20) DEFAULT NULL,

PRIMARY KEY (`USERID`),

KEY `USER_N50` (`RECENT_CONV_ID`),

KEY `USER_N49` (`LOCATION_ID`),

CONSTRAINT `USER_FK1` FOREIGN KEY (`RECENT_CONV_ID`) REFERENCES `RECENT_CONVERSATION` (`ID`),

CONSTRAINT `USER_FK2` FOREIGN KEY (`LOCATION_ID`) REFERENCES `USER_LOCATION` (`LOCATIONID`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 |

CREATE TABLE `USER_LOCATION` (

`LOCATIONID` bigint(20) NOT NULL AUTO_INCREMENT,

`CITY` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,

`COUNTRY` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,

`LATITUDE` double DEFAULT NULL,

`LOCAL_ADDR` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,

`LONGITUDE` double DEFAULT NULL,

`STATE` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,

PRIMARY KEY (`LOCATIONID`),

UNIQUE KEY `USER_LOCATION_U1` (`LOCAL_ADDR`,`CITY`,`STATE`,`COUNTRY`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

现在,我想使用USER_LOCATION的LOCATIONID更新USER中的LOCATION_ID.我如何使用JPA实现它?

我的Java课程:

@Entity(name="USER")

public class User {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private long userId;

@Column(name="PHONE_NUMBER", nullable=false)

private String phoneNumber;

@Column(name="FIRST_NAME", nullable=false)

private String firstName;

@Column(name="LAST_NAME", nullable=false)

private String lastName;

@Column(name="EMAIL", nullable=false)

private String email;

@Column(name="PROFILE_PIC", nullable=false)

private String profilepic;

@Column(name="LOGIN_TYPE", nullable=false)

private int loginType;

@Column(name="HONORS", nullable=false)

private long honors;

@ManyToOne(cascade={CascadeType.PERSIST})

@JoinColumn(name="LOCATION_ID")

private UserLocation userLocation;

@OneToMany(cascade=CascadeType.PERSIST)

@JoinColumn(name="RECENT_CONV_ID")

private RecentConversation recentConversation;

}

@Entity(name="USER_LOCATION")

@Table(name="USER_LOCATION", uniqueConstraints=@UniqueConstraint(columnNames={"LOCAL_ADDR", "CITY", "STATE", "COUNTRY"}))

@NamedQuery(name="addUserLocation", query="SELECT l FROM USER_LOCATION l " +

"WHERE l.local_addr = :lo_addr AND " +

"l.city = :city AND " +

"l.state = :state AND " +

"l.country = :country")

public class UserLocation {

@Id

@GeneratedValue

private long locationId;

@Column(name="LATITUDE")

private Double latitude;

@Column(name="LONGITUDE")

private Double longitude;

@Column(name="LOCAL_ADDR")

private String local_addr;

@Column(name="CITY")

private String city;

@Column(name="STATE")

private String state;

@Column(name="COUNTRY")

private String country;

@OneToMany(mappedBy="userLocation")

private Collection users = new HashSet();

}

请注意,我正在尝试实现的业务规则是,USER_LOCATION中应该没有基于UNIQUE KEY USER_LOCATION_U1的重复条目.此外,如果同一位置有多个用户,则USER中的LOCATION_ID应更新为该USER_LOCATION.非常感谢.

更新:

我的测试用例,

public class UserTest extends TestCase{

EntityManager em;

public void testUsersFromLocation() {

EntityManagerFactory emf = Persistence.createEntityManagerFactory("TalkExchange");

em = emf.createEntityManager();

User user = createNewUser();

em.getTransaction().begin();

// em.persist(user.getUserLocation());

em.merge(user);

em.flush();

em.detach(user.getUserLocation());

em.contains(user.getUserLocation());

em.contains(user);

em.getTransaction().commit();

getUsersAtLocation();

}

public User createNewUser() {

User user = new User();

user.setEmail("asf@gmail.com");

user.setFirstName("fgfg");

user.setLastName("uiu");

user.setLoginType(0);

user.setPhoneNumber("7777");

user.setProfilepic("http://vvv.com");

user.setUserId(234);

UserLocation userLocation = createUserLocation();

user.setUserLocation(userLocation);

// UserLocation userLocation = getExistingUserLocation();

// user.setUserLocation(userLocation);

userLocation.getUsers().add(user);

return user;

}

public User createNewUser() {

User user = new User();

user.setEmail("asf@gmail.com");

user.setFirstName("fgfg");

user.setLastName("uiu");

user.setLoginType(0);

user.setPhoneNumber("7777");

user.setProfilepic("http://vvv.com");

user.setUserId(234);

UserLocation userLocation = createUserLocation();

user.setUserLocation(userLocation);

// UserLocation userLocation = getExistingUserLocation();

// user.setUserLocation(userLocation);

userLocation.getUsers().add(user);

return user;

}

public UserLocation createUserLocation() {

UserLocation userLocation = new UserLocation();

userLocation.setCity("wrwer");

userLocation.setCountry("MM");

userLocation.setLatitude(new Double(10));

userLocation.setLongitude(new Double(10));

userLocation.setLocal_addr("dfdfd");

userLocation.setState("kjlkj");

// create a query to find out whether the above UserLocation exists in the database.

// if(exists)

// use the existing location

// else

// use add the new location

addLocationRule(userLocation);

return userLocation;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值