好的,这可能是一个微不足道的问题,但我无法想象和理解差异以及何时使用每个差异.关于单向和双向映射等概念如何影响一对多/多对多关系,我也有点不清楚.我现在正在使用Hibernate,所以任何与ORM相关的解释都会有所帮助.
举个例子,假设我有以下设置:
public class Person{
private Long personId;
private Set<Skill> skills;
//Getters and setters
}
public class Skill{
private Long skillId;
private String skillName;
//Getters and setters
}
Run Code Online (Sandbox Code Playgroud)
那么在这种情况下我会有什么样的映射?这个具体示例的答案肯定是值得赞赏的,但我也非常希望概述何时使用一对多和多对多以及何时使用连接表与连接列以及单向与双向.
我知道ON DUPLICATE KEY UPDATE如果已经存在该密钥的记录,您可以使用更新某个值,
我可以做这个:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3
Run Code Online (Sandbox Code Playgroud)
但是,如何在不必写出两次列和值的情况下执行此操作?
我有两个表 - >变量(id,name)和Variable_Entries(id,var_id,value).
我希望每个变量都有一组唯一的条目.如果我使值条目唯一,那么另一个变量将不能具有相同的值,这是不正确的.
有没有办法让值列对于相同的var_id是唯一的?
我有一个带有auto_incid(主键)的表.我试图避免插入重复的行.
重复行的示例:
id | field a | field b | field c |
1 4 6 7
2 4 6 7
Run Code Online (Sandbox Code Playgroud)
key(id)不重复,因为它是由MySQL自动生成的,但所有其他字段都是相同的.
我的问题很简单,但我不能说出来.我有一个用户表,每个用户都有id.
我想制作友谊表,但我不希望能够有重复的记录.意思不是这个:
id_user1 | id_user2
---------|----------
2 | 3
3 | 2
Run Code Online (Sandbox Code Playgroud)
我清楚了吗?
目前我为我的表创建了这个:
CREATE TABLE User(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
surname VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE Friends(
id_user1 INT NOT NULL,
id_user2 INT NOT NULL,
PRIMARY KEY(id_user1, id_user2),
FOREIGN KEY (id_user1) REFERENCES User(id),
FOREIGN KEY (id_user2) REFERENCES User(id),
);
Run Code Online (Sandbox Code Playgroud)
[编辑1:]也许最佳做法是两次保存每条记录?双向?
A link有两个components:componenta_id和componentb_id.为此,Link我在模型文件中有:
belongs_to :componenta, class_name: "Component"
belongs_to :componentb, class_name: "Component"
validates :componenta_id, presence: true
validates :componentb_id, presence: true
validates :componenta_id, uniqueness: { scope: :componentb_id }
validates :componentb_id, uniqueness: { scope: :componenta_id }
Run Code Online (Sandbox Code Playgroud)
并在迁移文件中:
create_table :links do |t|
t.integer :componenta_id, null: false
t.integer :componentb_id, null: false
...
end
add_index :links, :componenta_id
add_index :links, :componentb_id
add_index :links, [:componenta_id, :componentb_id], unique: true
Run Code Online (Sandbox Code Playgroud)
问题:这一切都有效.现在,无论他们的顺序如何,我都想要它们的组合componanta和componentb独特性.因此无论哪个组件是哪个组件(componenta哪个是componentb相同的链接;两个相同组件之间的链接).因此,不应允许下面的两个记录,因为它们代表相同的链接,因此不是唯一的:
我试图弄清楚如何解决最初看起来“简单”的问题。
我UserAccounts认为可以有很多Purcahse秒,但商业逻辑使然只能有一个Purchase在PurchaseState.IDLE状态(在实体领域)。Apurchase在第一次创建时是空闲的。
我有一个存储库,其中包含一种方法来确定用户是否购买了已存在给定状态的产品:
boolean existsByPurchaseStateInAndUserAccount_Id(List<PurchaseState> purchaseState, long userAccountId);
Run Code Online (Sandbox Code Playgroud)
我注意到一些测试并认为当两个请求非常接近/同时传递时(即并发问题和/或竞争条件),我可以创建多个购买。
这导致用户帐户有两次购买,并且都具有 IDLE 状态。
现在,有没有办法使用 @Transactional 来导致第二个持久性/事务回滚?我不确定简单地包装服务方法@Transcational(isolation=REPEATED_READ)
是否会缓解这个问题?即有没有办法 SQL 将处理这个事务?
我只能猜测这实际上并没有帮助,因为 SQL 事务没有跟踪existsBy,因此不会回滚?
countBy如果存在 >1 个符合条件的实体,是否是在方法结束时运行第二个查询以回滚事务的唯一真正解决方案?我仍然不觉得这是“完美的”并完全解决了竞争条件/TX 问题......
因此,该服务将看到有 2 个实体在两个事务中提交(尚未提交),但对于 T2,该服务可以抛出 RuntimeException 以触发回滚?
抱歉,我一直在阅读有关事务隔离的内容,但它似乎只适用于说我是否正在检查实体的字段值/列,而不是使用基于“count(*)”查询返回的逻辑。 ..
谢谢你的任何启示。
我将以下简单的webservice声明为@StatelessEJB,在GlassFish 3.1.2.2上使用EclipseLink 2.4.1运行,使用JTA DataSource连接到MySQL数据库:
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response update(TimeRow e) throws Exception {
if ((e.getKey() == null) || !e.getKey().keyValid()) {
return Response.status(400).build();
}
TimeRow existing = em.find(TimeRow.class, e.getKey());
if (existing == null) {
em.persist(e);
} else {
existing.setValues(e.getValues());
em.flush();
}
return Response.status(204).build();
}
Run Code Online (Sandbox Code Playgroud)
实体类TimeRow:
@Entity
@NamedQueries({
@NamedQuery(name="TimeRow.findAllByUser",
query="SELECT t FROM TimeRow t WHERE t.table.userId = :uid")
})
public class TimeRow implements Serializable {
@EmbeddedId
private TimeRowPK key;
@MapsId("userId")
@JoinColumn(name = "USERID", referencedColumnName = "userId")
@ManyToOne …Run Code Online (Sandbox Code Playgroud) 我正在使用php-MySQL在后端进行项目.它有各种文章可供浏览,分类为各种类别和用户登录系统.
我最近添加了一个监视列表功能,使用户可以将文章添加到他们的监视列表/仪表板中.
我有以下表格.
文章表
article-id(int)主要 - 唯一
cat(varchar)
名称(varchar)
subCat(varchar)
description(varchar)
添加日期
用户表
用户名(varchar)主要唯一
lname
fname
加入日期
.监视列表表
article-id(int)
username(varchar)
date_watch
我们可以看到没有用于监视列表表的唯一键
我想要(username + article-id)一个唯一的对因为每个用户名都存在多于1个文章ID而且反之亦然
我只想插入和删除行和它并不需要更新他们
如何防止重复条目?
到现在为止我一直用php检查行数
"SELECT * FROM watchlist WHERE article-id={$id} AND username={$user}"
Run Code Online (Sandbox Code Playgroud)
而如果
mysql_num_rows() >1(not allowed to insert)
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如果错误地执行INSERT命令将是一个重复的条目
如何防止它?
我正在使用phpmyadmin
+----+---------------+-------+---------------+
| id | name | phone | ip_addr |
+----+---------------+-------+---------------+
| 1 | customname001 | 1234 | 192.168.100.1 |
| 2 | customname002 | 2156 | 192.168.100.2 |
| 3 | customname003 | 9685 | 192.168.100.3 |
| 4 | customname004 | 1546 | 192.168.100.1 |
| 5 | customname005 | 1234 | 192.168.100.1 |
+----+---------------+-------+---------------+
Run Code Online (Sandbox Code Playgroud)
在我的 codeigniter 项目中,我试图构建一个模型,它将帮助我将新行插入到与上面类似的表中。我在这里要应用的条件是检查姓名、电话和 ip_addr 的组合是否唯一。
我知道对于单个列,如果我们将值设置为唯一,那么这些值就不能重复,但我的示例是不同的情况,我希望所有列(除了 id 之外)的组合是唯一的。
任何人都可以帮助我构建模型,该模型将帮助我添加新的姓名、电话和 ip_addr 对,并检查该对是否已存在并相应地给出反馈。
mysql ×7
java ×2
php ×2
sql ×2
codeigniter ×1
constraints ×1
database ×1
ejb ×1
hibernate ×1
insert ×1
jax-rs ×1
jpa ×1
jta ×1
many-to-many ×1
migration ×1
model ×1
one-to-many ×1
orm ×1
ruby ×1
spring ×1
spring-boot ×1
transactions ×1
unique ×1
validation ×1