我正在寻找Java的ORMs和Active Objects引起了我的注意.显然,它的灵感来自Rails的ActiveRecord.基于我所读到的,这种方法似乎通过采用约定优于配置来解决现有Java ORM的许多问题.
你的经历是什么?
Active对象模式的目标是什么?你能告诉我任何抽象的例子来轻松理解它吗?
早在2010年,Herb Sutter 就在Dobb博士的一篇文章中提倡使用活性物体而不是裸线.
这是一个C++ 11版本:
class Active {
public:
typedef std::function<void()> Message;
Active(const Active&) = delete;
void operator=(const Active&) = delete;
Active() : done(false) {
thd = std::unique_ptr<std::thread>(new std::thread( [=]{ this->run(); } ) );
}
~Active() {
send( [&]{ done = true; } );
thd->join();
}
void send(Message m) { mq.push_back(m); }
private:
bool done;
message_queue<Message> mq; // a thread-safe concurrent queue
std::unique_ptr<std::thread> thd;
void run() {
while (!done) {
Message msg = mq.pop_front();
msg(); // execute message …Run Code Online (Sandbox Code Playgroud) 据我所知,活动对象设计模式是将一个(私有/专用)线程生命周期与一个对象捆绑在一起并使其在独立数据上工作.从我读到的一些文档中,这种范式的演变是由于两个原因,第一,管理原始线程会很痛苦,第二个争用共享资源的线程使用互斥锁和锁不能很好地扩展.虽然我同意第一个原因,但我并不完全理解第二个原因.使对象处于活动状态只会使对象独立,但是锁定/互斥锁争用等问题仍然存在(因为我们仍然有共享队列/缓冲区),该对象只是将共享责任委派给消息队列.我看到的这种设计模式的唯一优势是我不得不在共享对象上执行长的异步任务(现在我只是将消息传递给共享队列,线程不再需要在互斥锁上长时间阻塞/锁,但他们仍然会阻止并争夺发布消息/任务).除了这种情况,有人可以告诉更多场景,这种设计模式将具有其他优势.
我的第二个问题是(我刚开始挖掘设计模式),活动对象,反应堆和前驱设计模式之间的概念差异是什么.您如何确定哪种设计模式更有效并更符合您的要求.如果某人能够展示某些示例来展示这三种设计模式将如何表现以及哪种模式在不同场景中具有比较优势/劣势,那将是非常好的.
我有点困惑,因为我使用了活动对象(使用共享线程安全缓冲区)和boost :: asio(Proactor)来做类似的异步内容,我想知道是否有任何人对适用性有更多的见解接近问题时的不同模式
我一直试图弄清楚如何在applet窗口中对角线移动可见图像.
如果按向上,向下,向左或向右按下图像(gif)会相应移动,但是如果您尝试同时按下两个键(例如同时向上和向右),图像只会按您按下的方向移动第二(即使你同时按下按键仍有微观延迟).
可能有一种简单的方法可以解决这个问题,我只是不知道,或者某个人已经想到了解决方法......我感谢任何帮助或建议.
谢谢
英雄级(这个类定义了"英雄"是什么;在这种情况下是一个简单的像素人,他能做什么)
import objectdraw.*;
import java.awt.*;
public class Hero extends ActiveObject {
private DrawingCanvas canvas;
private VisibleImage player;
public Hero(Location initLocation, Image playerPic, DrawingCanvas aCanvas) {
canvas = aCanvas;
player = new VisibleImage(playerPic, canvas.getWidth()/3,
canvas.getWidth()/3, canvas);
start();
}
public void run()
{
}
public void move(double dx, double dy)
{
player.move(dx, dy);
}
}
Run Code Online (Sandbox Code Playgroud)
HeroGame类(此类创建"Hero"并指定位置,以及用于移动的键)
import objectdraw.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class HeroGame extends WindowController implements KeyListener {
private Hero theHero;
private Image playerPic; …Run Code Online (Sandbox Code Playgroud) 我已经分叉了一个 Atlassian Stash 插件用于构建服务器集成,它使用 ActiveObjects 组件来存储数据。我遇到以下问题:
如果我遵循其他字段并为 OneToMany 字段添加 getter 和 setter,如下所示
@OneToMany
TestMapping[] getTestMapping();
void setTestMapping(TestMapping[] powerMappings);
Run Code Online (Sandbox Code Playgroud)
使用实体时出现以下异常:
[INFO] [talledLocalContainer] Caused by: java.lang.RuntimeException: Unrecognized type: [Lsome.package.TestMapping;
[INFO] [talledLocalContainer] at net.java.ao.types.TypeManager.getType(TypeManager.java:68) ~[na:na]
[INFO] [talledLocalContainer] at net.java.ao.schema.SchemaGenerator.getSQLTypeFromMethod(SchemaGenerator.java:481) ~[na:na]
Run Code Online (Sandbox Code Playgroud)
谷歌搜索这个问题只找到了删除 setter 的解决方案,就像这篇文章中建议的那样。但是,如果配置已存在,则无法设置该字段。我不认为删除 ActiveObject 并保存新的 ActiveObject 是正确的方法。
如何解决这个问题?或者,如果不可能,如何在不使用 ActiveObjects 中的 setter 的情况下更新现有对象?
最近我发现了ActiveObejcts,我真的很喜欢它。现在我使用的是 Atlassian 插件的最后一个版本,只有net.java.aoORM的部分。编译并运行良好。当然,如果它符合我的要求,我必须做一些性能测试。
存在@Implementation注释。那是怎么用的?javadoc 非常简短。
更新
解决方案:
public class M5 {
public static void main(String[] args) throws SQLException {
EntityManager m = EntityManagerBuilder
.url("jdbc:hsqldb:./db/db")
.username("root")
.password("")
.c3po()
.build();
m.migrate(Employee.class);
Employee p = m.create(Employee.class);
p.setFirstName("Peter");
p.setLastName("Mmm");
System.err.println(p.getLastName()); // prints "ln: Mmm"
p.save();
}
}
public class Emp {
private Employee employee;
public Emp(Employee employee) {
this.employee = employee;
}
public String getLastName() {
return "ln: " + employee.getLastName();
}
}
@Implementation(Emp.class)
interface Employee extends Entity …Run Code Online (Sandbox Code Playgroud) java ×4
c++ ×2
orm ×2
activerecord ×1
applet ×1
boost-asio ×1
c++11 ×1
concurrency ×1
diagonal ×1
gif ×1
persistence ×1
reactor ×1